package org.apache.ibatis.common.reflection.wrapper;

import org.apache.ibatis.common.reflection.MetaObject;
import org.apache.ibatis.common.reflection.factory.ObjectFactory;
import org.apache.ibatis.common.reflection.property.PropertyTokenizer;

import java.util.List;

/**
 * @Name ObjectWrapper
 * @Description: 对象（集合）包装器
 * 描述信息：该接口是对象（集合）包装器的总接口，使用装饰器模式对各种类型的对象（包括基本 Bean 对象、Map 对象及其他 Collection 容器对象等）进行进一步封装，为其增加一些功能，使它们更易于使用。
 * @Version v1.0.0
 * @Author: lichao
 * @Date: 2024-04-28 13:52:04
 **/
public interface ObjectWrapper {

    /**
     * get 一个属性的值
     *
     * @param prop 属性
     * @return java.lang.Object 结果
     * @version v1.0.0
     * @author lichao
     * @date 2024-04-28 13:59:19
     */
    Object get(PropertyTokenizer prop);

    /**
     * set 一个属性的值
     *
     * @param prop  属性
     * @param value 属性值
     * @version v1.0.0
     * @author lichao
     * @date 2024-04-28 13:59:45
     */
    void set(PropertyTokenizer prop, Object value);

    /**
     * 查找属性
     *
     * @param name                属性名称
     * @param useCamelCaseMapping 是否使用 “驼峰案例映射”
     * @return java.lang.String 结果
     * @version v1.0.0
     * @author lichao
     * @date 2024-04-28 13:59:59
     */
    String findProperty(String name, boolean useCamelCaseMapping);

    /**
     * 获取所有的 getter 方法名称
     *
     * @return java.lang.String[] 结果
     * @version v1.0.0
     * @author lichao
     * @date 2024-04-28 14:01:18
     */
    String[] getGetterNames();

    /**
     * 获取所有的 setter 方法名称
     *
     * @return java.lang.String[] 结果
     * @version v1.0.0
     * @author lichao
     * @date 2024-04-28 14:01:34
     */
    String[] getSetterNames();

    /**
     * 获取 getter 方法的类型
     *
     * @param name 属性名称
     * @return java.lang.Class<?> 结果
     * @version v1.0.0
     * @author lichao
     * @date 2024-04-28 14:01:53
     */
    Class<?> getGetterType(String name);

    /**
     * 获取 setter 方法的类型
     *
     * @param name 属性名称
     * @return java.lang.Class<?> 结果
     * @version v1.0.0
     * @author lichao
     * @date 2024-04-28 14:02:22
     */
    Class<?> getSetterType(String name);

    /**
     * 判断属性是否存在 setter 方法
     *
     * @param name 属性名称
     * @return boolean 结果
     * @version v1.0.0
     * @author lichao
     * @date 2024-04-28 14:02:58
     */
    boolean hasSetter(String name);

    /**
     * 判断属性是否存在 getter 方法
     *
     * @param name 属性名称
     * @return boolean 结果
     * @version v1.0.0
     * @author lichao
     * @date 2024-04-28 14:03:29
     */
    boolean hasGetter(String name);

    /**
     * 生成一个属性的实例
     *
     * @param name          属性名称
     * @param prop          属性标记器
     * @param objectFactory 实例工厂
     * @return org.apache.ibatis.common.reflection.MetaObject 结果
     * @version v1.0.0
     * @author lichao
     * @date 2024-04-28 14:03:49
     */
    MetaObject instantiatePropertyValue(String name, PropertyTokenizer prop, ObjectFactory objectFactory);

    /**
     * 判断是否为集合类型
     *
     * @return boolean 结果
     * @version v1.0.0
     * @author lichao
     * @date 2024-04-28 14:04:59
     */
    boolean isCollection();

    /**
     * 添加一个元素
     *
     * @param element 元素
     * @version v1.0.0
     * @author lichao
     * @date 2024-04-28 14:05:25
     */
    void add(Object element);

    /**
     * 批量添加元素
     *
     * @param element 元素列表
     * @version v1.0.0
     * @author lichao
     * @date 2024-04-28 14:05:44
     */
    <E> void addAll(List<E> element);


}

